home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 9943 / 9943.xpi / content / script-compiler.js < prev    next >
Text File  |  2009-03-18  |  7KB  |  237 lines

  1. var tagcloudjs_gmCompiler={
  2.  
  3. // getUrlContents adapted from Greasemonkey Compiler
  4. // http://www.letitblog.com/code/python/greasemonkey.py.txt
  5. // used under GPL permission
  6. //
  7. // most everything else below based heavily off of Greasemonkey
  8. // http://greasemonkey.mozdev.org/
  9. // used under GPL permission
  10.  
  11. getUrlContents: function(aUrl){
  12.     var    ioService=Components.classes["@mozilla.org/network/io-service;1"]
  13.         .getService(Components.interfaces.nsIIOService);
  14.     var    scriptableStream=Components
  15.         .classes["@mozilla.org/scriptableinputstream;1"]
  16.         .getService(Components.interfaces.nsIScriptableInputStream);
  17.  
  18.     var    channel=ioService.newChannel(aUrl, null, null);
  19.     var    input=channel.open();
  20.     scriptableStream.init(input);
  21.     var    str=scriptableStream.read(input.available());
  22.     scriptableStream.close();
  23.     input.close();
  24.  
  25.     return str;
  26. },
  27.  
  28. isGreasemonkeyable: function(url) {
  29.     var scheme=Components.classes["@mozilla.org/network/io-service;1"]
  30.         .getService(Components.interfaces.nsIIOService)
  31.         .extractScheme(url);
  32.     return (
  33.         (scheme == "http" || scheme == "https" || scheme == "file") &&
  34.         !/hiddenWindow\.html$/.test(url)
  35.     );
  36. },
  37.  
  38. contentLoad: function(e) {
  39.     var unsafeWin=e.target.defaultView;
  40.     if (unsafeWin.wrappedJSObject) unsafeWin=unsafeWin.wrappedJSObject;
  41.  
  42.     var unsafeLoc=new XPCNativeWrapper(unsafeWin, "location").location;
  43.     var href=new XPCNativeWrapper(unsafeLoc, "href").href;
  44.  
  45.     if (
  46.         tagcloudjs_gmCompiler.isGreasemonkeyable(href)
  47.         && ( /http:\/\/(www\.)?google\..*\/(search|products|blogsearch|news|scholar).*/.test(href) || /http:\/\/(www\.)?google\..*\/.*#/.test(href) || /http:\/\/google\..*\/search\?.*/.test(href) || /http:\/\/(news|scholar|blogsearch)\.google\..*\/.*/.test(href) || /http:\/\/blogsearch\.google\..*\/.*/.test(href)|| /http:\/\/(.*\.)?search\.yahoo\.co.*\/.*/.test(href)|| /http(s)?:\/\/((search|www)\.)?twitter\.com/.test(href))
  48.         && true
  49.     ) {
  50.         var script=tagcloudjs_gmCompiler.getUrlContents(
  51.             'chrome://searchcloudlet/content/tagcloudjs.js'
  52.         );
  53.         tagcloudjs_gmCompiler.injectScript(script, href, unsafeWin);
  54.     }
  55. },
  56.  
  57. injectScript: function(script, url, unsafeContentWin) {
  58.     var sandbox, script, logger, storage, xmlhttpRequester;
  59.     var safeWin=new XPCNativeWrapper(unsafeContentWin);
  60.  
  61.     sandbox=new Components.utils.Sandbox(safeWin);
  62.  
  63.     var storage=new tagcloudjs_ScriptStorage();
  64.     xmlhttpRequester=new tagcloudjs_xmlhttpRequester(
  65.         unsafeContentWin, window//appSvc.hiddenDOMWindow
  66.     );
  67.  
  68.     sandbox.window=safeWin;
  69.     sandbox.document=sandbox.window.document;
  70.     sandbox.unsafeWindow=unsafeContentWin;
  71.  
  72.     // patch missing properties on xpcnw
  73.     sandbox.XPathResult=Components.interfaces.nsIDOMXPathResult;
  74.  
  75.     // add our own APIs
  76.     sandbox.GM_addStyle=function(css) { tagcloudjs_gmCompiler.addStyle(sandbox.document, css) };
  77.     sandbox.GM_setValue=tagcloudjs_gmCompiler.hitch(storage, "setValue");
  78.     sandbox.GM_getValue=tagcloudjs_gmCompiler.hitch(storage, "getValue");
  79.     sandbox.GM_openInTab=tagcloudjs_gmCompiler.hitch(this, "openInTab", unsafeContentWin);
  80.     sandbox.GM_xmlhttpRequest=tagcloudjs_gmCompiler.hitch(
  81.         xmlhttpRequester, "contentStartRequest"
  82.     );
  83.     //unsupported
  84.     sandbox.GM_registerMenuCommand=function(){};
  85.     sandbox.GM_log=function(){};
  86.     sandbox.GM_getResourceURL=function(){};
  87.     sandbox.GM_getResourceText=function(){};
  88.  
  89.     sandbox.__proto__=sandbox.window;
  90.  
  91.     try {
  92.         this.evalInSandbox(
  93.             "(function(){"+script+"})()",
  94.             url,
  95.             sandbox);
  96.     } catch (e) {
  97.         var e2=new Error(typeof e=="string" ? e : e.message);
  98.         e2.fileName=script.filename;
  99.         e2.lineNumber=0;
  100.         //GM_logError(e2);
  101.         //alert(e2); - do not alert
  102.     }
  103. },
  104.  
  105. evalInSandbox: function(code, codebase, sandbox) {
  106.     if (Components.utils && Components.utils.Sandbox) {
  107.         // DP beta+
  108.         Components.utils.evalInSandbox(code, sandbox);
  109.     } else if (Components.utils && Components.utils.evalInSandbox) {
  110.         // DP alphas
  111.         Components.utils.evalInSandbox(code, codebase, sandbox);
  112.     } else if (Sandbox) {
  113.         // 1.0.x
  114.         evalInSandbox(code, sandbox, codebase);
  115.     } else {
  116.         throw new Error("Could not create sandbox.");
  117.     }
  118. },
  119.  
  120. openInTab: function(unsafeContentWin, url) {
  121.     var tabBrowser = getBrowser(), browser, isMyWindow = false;
  122.     for (var i = 0; browser = tabBrowser.browsers[i]; i++)
  123.         if (browser.contentWindow == unsafeContentWin) {
  124.             isMyWindow = true;
  125.             break;
  126.         }
  127.     if (!isMyWindow) return;
  128.  
  129.     var loadInBackground, sendReferrer, referrer = null;
  130.     loadInBackground = tabBrowser.mPrefs.getBoolPref("browser.tabs.loadInBackground");
  131.     sendReferrer = tabBrowser.mPrefs.getIntPref("network.http.sendRefererHeader");
  132.     if (sendReferrer) {
  133.         var ios = Components.classes["@mozilla.org/network/io-service;1"]
  134.                             .getService(Components.interfaces.nsIIOService);
  135.         referrer = ios.newURI(content.document.location.href, null, null);
  136.      }
  137.      tabBrowser.loadOneTab(url, referrer, null, null, loadInBackground);
  138.  },
  139.  
  140.  hitch: function(obj, meth) {
  141.     var unsafeTop = new XPCNativeWrapper(unsafeContentWin, "top").top;
  142.  
  143.     for (var i = 0; i < this.browserWindows.length; i++) {
  144.         this.browserWindows[i].openInTab(unsafeTop, url);
  145.     }
  146. },
  147.  
  148. apiLeakCheck: function(allowedCaller) {
  149.     var stack=Components.stack;
  150.  
  151.     var leaked=false;
  152.     do {
  153.         if (2==stack.language) {
  154.             if ('chrome'!=stack.filename.substr(0, 6) &&
  155.                 allowedCaller!=stack.filename 
  156.             ) {
  157.                 leaked=true;
  158.                 break;
  159.             }
  160.         }
  161.  
  162.         stack=stack.caller;
  163.     } while (stack);
  164.  
  165.     return leaked;
  166. },
  167.  
  168. hitch: function(obj, meth) {
  169.     if (!obj[meth]) {
  170.         throw "method '" + meth + "' does not exist on object '" + obj + "'";
  171.     }
  172.  
  173.     var hitchCaller=Components.stack.caller.filename;
  174.     var staticArgs = Array.prototype.splice.call(arguments, 2, arguments.length);
  175.  
  176.     return function() {
  177.         if (tagcloudjs_gmCompiler.apiLeakCheck(hitchCaller)) {
  178.             return;
  179.         }
  180.         
  181.         // make a copy of staticArgs (don't modify it because it gets reused for
  182.         // every invocation).
  183.         var args = staticArgs.concat();
  184.  
  185.         // add all the new arguments
  186.         for (var i = 0; i < arguments.length; i++) {
  187.             args.push(arguments[i]);
  188.         }
  189.  
  190.         // invoke the original function with the correct this obj and the combined
  191.         // list of static and dynamic arguments.
  192.         return obj[meth].apply(obj, args);
  193.     };
  194. },
  195.  
  196. addStyle:function(doc, css) {
  197.     var head, style;
  198.     head = doc.getElementsByTagName('head')[0];
  199.     if (!head) { return; }
  200.     style = doc.createElement('style');
  201.     style.type = 'text/css';
  202.     style.innerHTML = css;
  203.     head.appendChild(style);
  204. },
  205.  
  206. onLoad: function() {
  207.     var    appcontent=window.document.getElementById("appcontent");
  208.     if (appcontent && !appcontent.greased_tagcloudjs_gmCompiler) {
  209.         appcontent.greased_tagcloudjs_gmCompiler=true;
  210.         appcontent.addEventListener("DOMContentLoaded", tagcloudjs_gmCompiler.contentLoad, false);
  211.     }
  212. },
  213.  
  214. onUnLoad: function() {
  215.     //remove now unnecessary listeners
  216.     window.removeEventListener('load', tagcloudjs_gmCompiler.onLoad, false);
  217.     window.removeEventListener('unload', tagcloudjs_gmCompiler.onUnLoad, false);
  218.     window.document.getElementById("appcontent")
  219.         .removeEventListener("DOMContentLoaded", tagcloudjs_gmCompiler.contentLoad, false);
  220. },
  221.  
  222. }; //object tagcloudjs_gmCompiler
  223.  
  224.  
  225. function tagcloudjs_ScriptStorage() {
  226.     this.prefMan=new tagcloudjs_PrefManager();
  227. }
  228. tagcloudjs_ScriptStorage.prototype.setValue = function(name, val) {
  229.     this.prefMan.setValue(name, val);
  230. }
  231. tagcloudjs_ScriptStorage.prototype.getValue = function(name, defVal) {
  232.     return this.prefMan.getValue(name, defVal);
  233. }
  234.  
  235.  
  236. window.addEventListener('load', tagcloudjs_gmCompiler.onLoad, false);
  237. window.addEventListener('unload', tagcloudjs_gmCompiler.onUnLoad, false);